#include "stm32f1xx_hal.h"
#include "DevicesLed.h"



LedStateType ex_typeLedState;


void vLedInit(void)
{
    GPIO_InitTypeDef GPIO_InitStruct = {0};

    /* GPIO Ports Clock Enable */
    LED_GREEN_RCC_GPIO_CLK_ENABLE();
    LED_YELLOW_RCC_GPIO_CLK_ENABLE();
    LED_RED_RCC_GPIO_CLK_ENABLE();

    /*Configure GPIO pin Output Level */
    HAL_GPIO_WritePin(LED_GREEN_GPIO_Port, LED_GREEN_Pin, GPIO_PIN_SET);
    HAL_GPIO_WritePin(LED_YELLOW_GPIO_Port, LED_YELLOW_Pin, GPIO_PIN_SET);
    HAL_GPIO_WritePin(LED_RED_GPIO_Port, LED_RED_Pin, GPIO_PIN_SET);

    /*Configure GPIO pin : PtPin */
    GPIO_InitStruct.Pin = LED_GREEN_Pin;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    HAL_GPIO_Init(LED_GREEN_GPIO_Port, &GPIO_InitStruct);

    GPIO_InitStruct.Pin = LED_YELLOW_Pin;
    HAL_GPIO_Init(LED_YELLOW_GPIO_Port, &GPIO_InitStruct);

    GPIO_InitStruct.Pin = LED_RED_Pin;
    HAL_GPIO_Init(LED_RED_GPIO_Port, &GPIO_InitStruct);

    LED_CLOSE();
    vLedOpen(LED_YELLOW | LED_RED);
    vLedSetStatus(LED_YELLOW | LED_RED, LED_SLOW);
}

void vLedOpen(uint16_t ucNumber)
{
    if(ucNumber & LED_GREEN)
        HAL_GPIO_WritePin(LED_GREEN_GPIO_Port, LED_GREEN_Pin, GPIO_PIN_RESET);
    if(ucNumber & LED_YELLOW)
        HAL_GPIO_WritePin(LED_YELLOW_GPIO_Port, LED_YELLOW_Pin, GPIO_PIN_RESET);
    if(ucNumber & LED_RED)
        HAL_GPIO_WritePin(LED_RED_GPIO_Port, LED_RED_Pin, GPIO_PIN_RESET);
}

void vLedClose(uint16_t ucNumber)
{
    if(ucNumber & LED_GREEN)
        HAL_GPIO_WritePin(LED_GREEN_GPIO_Port, LED_GREEN_Pin, GPIO_PIN_SET);
    if(ucNumber & LED_YELLOW)
        HAL_GPIO_WritePin(LED_YELLOW_GPIO_Port, LED_YELLOW_Pin, GPIO_PIN_SET);
    if(ucNumber & LED_RED)
        HAL_GPIO_WritePin(LED_RED_GPIO_Port, LED_RED_Pin, GPIO_PIN_SET);
}

void vLedRevesal(uint16_t ucNumber)
{
    if(ucNumber & LED_GREEN)
        HAL_GPIO_TogglePin(LED_GREEN_GPIO_Port, LED_GREEN_Pin);
    if(ucNumber & LED_YELLOW)
        HAL_GPIO_TogglePin(LED_YELLOW_GPIO_Port, LED_YELLOW_Pin);
    if(ucNumber & LED_RED)
        HAL_GPIO_TogglePin(LED_RED_GPIO_Port, LED_RED_Pin);
}

void vLedSetStatus(uint16_t ucNumber, uint32_t uiStatus)
{
    if(ucNumber & LED_RED)
        ex_typeLedState.red = uiStatus;
    if(ucNumber & LED_GREEN)
        ex_typeLedState.green = uiStatus;
    if(ucNumber & LED_YELLOW)
        ex_typeLedState.yellow = uiStatus;
}

void vLedShowStatus(uint16_t usName, uint32_t uiStatus, uint32_t uiCnt)
{
    switch(uiStatus)
    {
        case LED_ENABLE: vLedOpen(usName); break;
        case LED_DISABLE: vLedClose(usName); break;
        case LED_SLOW: if(uiCnt & 1) vLedRevesal(usName); break;
        case LED_FAST: vLedRevesal(usName); break;

        default: break;
    }
}
